package project06.adt; 

import static java.lang.Math.random;
import static java.lang.System.out;


public class ListaSimple implements Lista{

	class NodoLista{
		private Object dato;
		private NodoLista sig;
		
		public NodoLista(Object obj){
			dato = obj;
			sig = null;	
		}
		
		public NodoLista(Object obj, NodoLista nl){
			dato = obj;
			sig = nl;	
		}
	}
	
	private NodoLista lista;
	private int size;
	
	public ListaSimple(){
		lista = null;
		size=0;
	}
    public int size() {
        return size;
    }
	public boolean insertar(Object obj) {
		try {
			NodoLista aux = new NodoLista(obj, lista);
			lista = aux;
		} catch(Exception e){
			out.println(e.getMessage());
			return false;
		}
		size++;
		return true;
	}
/**
 * Elimina la primera ocurrencia del objeto
 * */
	public boolean eliminar(Object obj) {
		if (estaVacia())
			return false;

		NodoLista iter = lista;
		NodoLista aux;

		if (lista.dato.equals(obj)) {
			lista = iter.sig;
			size--;
			return true;
		}

		while (iter.sig != null) {
			if (iter.sig.dato.equals(obj)) {
				aux = iter.sig;
				iter.sig = aux.sig;
				size--;
				return true;
			}
			iter = iter.sig;
		}
		return false;
	}
	public boolean eliminar(int index){
	    NodoLista iter=lista;
	    NodoLista aux=null;
	    if(index<0||index>=size()) 
	        throw new IndexOutOfBoundsException("Fuera de rango");
		if(estaVacia())
			return false;
		if(index==0){
		    lista=lista.sig;
			size--;
			return true;
		}
		for(int i=0;i != index;i++){
			iter = iter.sig;
		}
	    iter=iter.sig;
		size--;
	    return true;
	}
	public void vaciar() {
		lista = null;
		size=0;
	}

	@Override
	public boolean estaVacia() {
		return lista == null;
	}

	public Object obtener(int index) {
		int i = 0;
		NodoLista iter = lista;
		
		if(estaVacia())
			return null;
		
		while(i++ < index - 1 && iter.sig != null){
			iter = iter.sig;
		}
		
		if(i == index)
			return iter.dato;
		else
			return null;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Lista l1 = new ListaSimple();
		System.out.println("Prueba estaVacia:Resultado Esperado:true::"+ l1.estaVacia());
		System.out.println("Prueba size:Resultado Esperado:true::"+l1.estaVacia());
		
		l1.insertar("A");
		l1.insertar("B");
		l1.insertar("C");
		System.out.println("Prueba Insertar/Size:Resultado Esperado:true::"+(l1.size()==3));
		
		int i = 0, n = 500;
		while(i++ < n)
			l1.insertar(new Double(java.lang.Math.random() * 100 * i/3));
		
		l1.insertar("Z");

		System.out.println("Prueba Insertar/Size:Resultado Esperado:true::"+(l1.size()==504));
		System.out.println("Prueba estaVacia:Resultado Esperado:false::"+l1.estaVacia());
		System.out.println("Prueba obtenerResultado Esperado::lista de objetos::");
		i = 1;
		Object valor;
		while(!l1.estaVacia() && i <= n + 4){
			valor = l1.obtener(i++);
			System.out.println(valor);
		}
		
		System.out.println("Prueba eliminar:Resultado Esperado:true::"+l1.eliminar("Z"));
		System.out.println("Prueba eliminar:Resultado Esperado:true::"+l1.eliminar("A"));
		System.out.println("Prueba eliminar:Resultado Esperado:true::"+l1.eliminar("B"));
		
		System.out.println("Prueba eliminar:Resultado Esperado:true::"+l1.eliminar("C"));
		System.out.println("Prueba eliminar:Resultado Esperado:false::"+l1.eliminar("Z"));
		System.out.println("Prueba eliminar:Resultado Esperado:false::"+l1.eliminar("A"));
		System.out.println("Prueba eliminar:Resultado Esperado:false::"+l1.eliminar("B"));
		System.out.println("Prueba eliminar:Resultado Esperado:false::"+l1.eliminar("C"));
		l1.vaciar();
		System.out.println("Prueba vaciar:Resultado Esperado:true::"+(l1.estaVacia()&&l1.size()==0));

	}


}
